package distributed.lock.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.params.SetParams;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class JedisTool {

    private final static JedisPool jedisPool;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(8);
        jedisPoolConfig.setMaxWaitMillis(3000);
        jedisPoolConfig.setMinIdle(0);
        jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 500);
    }


    //set key value [EX seconds] [PX milliseconds] [NX|XX]
    // EX seconds − 设置指定的到期时间(以秒为单位)。
    // PX milliseconds – 设置指定的到期时间(以毫秒为单位)。
    // NX – 仅在键不存在时设置键。
    // XX – 只有在键已存在时才设置。
    public static String setnx(String key, String value, long time, TimeUnit timeUnit) {
        Jedis jedis = jedisPool.getResource();
        try {
            return jedis.set(key, value, SetParams.setParams().nx().ex((int) timeUnit.toMillis(time)));
        } finally {
            if (null != jedis) {
                jedis.close();
            }
        }
    }


    public static Object delifequals(String luaStr, List<String> keys, List<String> args) {
        Jedis jedis = jedisPool.getResource();
        try {
            return jedis.eval(luaStr, keys, args);
        } finally {
            if (null != jedis) {
                jedis.close();
            }
        }
    }
}
